package com.yuelife.market.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

//rabbitmq，消息队列的处理，在这里面创建交换机、队列
@Configuration
public class RabbitmqConfig {

    //生产者（创建订单时），会与交换机交互，将消息发送至交换机，交换机再把消息传给队列，所以队列与消费者交互
    //创建交换机
    @Bean
    public TopicExchange orderExchange(){
        return new TopicExchange("order-exchange",true,false);
    }
    //创建队列
    @Bean
    public Queue orderQueue(){
        return new Queue("order-queue",true,false,false);
    }
    //将队列和交换机绑定
    @Bean
    public Binding bindingOrderExchangeQueue(){
        //with("order.#")是路由key，在向交换机中传入消息的时候，就有设置存入消息的路由key，格式是：order.订单编号
        return BindingBuilder.bind(orderQueue()).to(orderExchange()).with("order.#");
    }

    //以下是待支付队列和交换机，如果支付宝调用成功支付过后，就会过来把待支付队列中的消息消费掉，并且修改数据中订单的状态为已支付，如果超时就失效，在死信队列中消费过后直接修改数据库订单状态
    //创建交换机，与生产者交互
    @Bean
    public TopicExchange waitPayExchange(){
        return new TopicExchange("waitpay-exchange",true,false);
    }
    //创建待支付队列
    @Bean
    public Queue waitPayQueue(){
        //定义这个待支付队列的参数
        Map params=new HashMap();
        params.put("x-message-ttl",60000);//定义待支付 队列消息的过期时间 ，60s 过期
        params.put("x-dead-letter-exchange","waitpay-dead-exchange");//如果超时，那么就会到这个交换机中（死信交换机）
        params.put("x-dead-letter-routing-key","dead.order");//发送到这个死信交换机中的路由key，这个路由key是传到死信队列的
        return new Queue("waitpay-queue",true,false,false,params);//设置的参数需要传进来
    }
    //将待支付队列和交换机绑定
    @Bean
    public Binding bindingWaitPayExchangeQueue(){
        return BindingBuilder.bind(waitPayQueue()).to(waitPayExchange()).with("waitpay.#");//这个路由key是未支付的订单传过来的
    }

    //以下是死信交换机，其实也是普通交换机，只是叫法 为：死信
    @Bean
    public TopicExchange waitPayDeadExchange(){
        return new TopicExchange("waitpay-dead-exchange",true,false);
    }
    //死信队列
    @Bean
    public Queue waitPayDeadQueue(){
        return new Queue("waitpay-dead-queue",true,false,false);
    }
    //死信的绑定
    @Bean
    public Binding bindingWaitPayDeadExchangeQueue(){
        return BindingBuilder.bind(waitPayDeadQueue()).to(waitPayDeadExchange()).with("dead.order");//这个路由key是由待支付队列中过期消息传过来的
    }

















}
